package com.kevinkk.string;

/**
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
 * 如果剩余字符少于 k 个，则将剩余字符全部反转。
 * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
 */

/**
 * 这道题的关键其实就在于，找到最后一个要反转的元素 last
 * 如果 last 之后还有元素，那么就是符合（如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样）
 * 如果 last 之后没有元素，那么就是符合（如果剩余字符少于 k 个，则将剩余字符全部反转。）
 */

public class ReverseStringII {
    class Solution {
        public String reverseStr(String s, int k) {
            char[] c = s.toCharArray();
            int length = c.length;
            for (int i = 0; i < length; i += 2 * k) {
                int last = i + k - 1;
                if (last < length) {
                    reverse(c, i, last);
                } else {
                    reverse(c, i, length - 1);
                }
            }
            return new String(c);
        }

        private void reverse(char[] c, int i, int j) {
            while (i < j) {
                char temp = c[i];
                c[i] = c[j];
                c[j] = temp;
                i++;
                j--;
            }
        }
    }
}
